<?php
// +----------------------------------------------------------------------
// | SparkShop 坚持做优秀的商城系统
// +----------------------------------------------------------------------
// | Copyright (c) 2022~2099 http://sparkshop.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: NickBai  <1902822973@qq.com>
// +----------------------------------------------------------------------
namespace app\service;

use app\model\card\Card;
use app\model\cardBig\CardBig;
use think\exception\ValidateException;

class CipherService
{
    public $vi  = '2023032016866888';//16位
    /**
     * 密钥加密
     * @param string $key
     * @param string $str
     * @return array
     */
    public function key_encrypt(string $key,string $str): string
    {
        $vi  = $this->vi;//16位
        $sign = openssl_encrypt($str, 'AES-128-CBC', $key,  OPENSSL_RAW_DATA, $vi);
        $sign = base64_encode($sign);


        return $sign;
    }

    /**
     * 密钥解密
     * @param string $key
     * @param string $data
     * @return array
     */
    public function key_decrypt(string $key,string $data): string
    {
        $vi  = $this->vi;//16位
        $sign = openssl_decrypt(base64_decode($data), 'AES-128-CBC', $key, 1, $vi);
        return $sign;
    }

    /**
     * 生成不重复的key
     * @param int $nums
     * @param int $orderid
     * @return array
     */
    public function key_generate( int $numKeys = 1,int $orderid = 0,int $insert = 0): array
    {
        $insertedKeys = 0;  
        $existingKeys = [];  
      
        // 生成并尝试插入密钥，直到达到所需的数量  
        while ($insertedKeys < $numKeys) {  
            $newKey =bin2hex(random_bytes(16));
      
            // 检查密钥是否已经存在（在实际应用中，由于我们使用了INSERT IGNORE，这一步其实是多余的）  
            // 但为了示例的完整性，我们还是保留了这个检查步骤。  
            if (!in_array($newKey, $existingKeys)) {  
                //insertUniqueKey($pdo, $newKey);   重写插入数据库操作
                
                $insertedKeys++;  
                $existingKeys[] = $newKey; // 在实际应用中，这一步也是多余的，因为我们使用了数据库的唯一性约束。  
            }  
        }  

        return $existingKeys;
    }
    
}